# -.- coding: utf-8 -.-

from django.db import models
from django.contrib.auth.models import User
from django.utils.translation import ugettext_lazy as _

GENERO_ELECCION = (
    ('F', 'Femenino'),
    ('M', 'Masculino'),
    ('I', 'Indefinido'),
)

ACCION_BONO = (
    ('+', 'Sumar'),
    ('-', 'Restar'),
    ('*', 'Multiplicar'),
    ('/', 'Dividir'),
    ('r', 'Reemplazar'),
)

#Características sobre las que puede aplicarse bono.
#Estas características se podrán emplear para cualquier situación en la que se requiera bono
#Irá creciendo esta tabla conforma haga falta considerar nuevas características
#(En principio sólo figuran las que me han ido haciendo falta para pruebas)
CARACTERISTICAS_BONO = (
    #Características bonificadas por "elección de CATEGORIA"
    ('Vida#num_multiplos','Múltiplos Vida'),
    ('Vida#categoria','PV Categoría'),
    ('Turno#tipo_turno#categoria','Turno Categoría'),
    ('UsoKi#cmarcial','Conocimiento Marcial'),
    ('CV#base','CV Innatos'),
    ('Ataque#coste','Coste H. Ataque'),
    ('Defensa#coste','Coste H. Defensa'),
    ('Esquiva#coste','Coste H. Esquiva'),
    ('LlevarArmadura#coste','Coste Llevar Armadura'),
    #('','Coste Ki'),   PREGUNTAR DONDE ESTÁ ESTO EN LA FICHA...
    #('','Múltiplo Acumulación'),   IDEM
    ('Zeon#coste','Coste Zeon'),
    ('AcumulacionMagica#coste','Múltiplo ACT'),
    ('ProyeccionMagica#coste','Coste Proyección Mágica'),
    #('','Coste Convocar'), IDEM
    #('','Coste Dominar'), IDEM
    #('','Coste Atar'), IDEM
    #('','Coste Desconvocar'), IDEM
    ('CV#base','CV'),
    ('ProyeccionPsiquica#coste','Coste Proyección Psíquica'),
    ('HabilidadSecundariaFija#grupo:atleticas#coste_grupo','Coste Atléticas'),
    ('HabilidadSecundariaFija#grupo:sociales#coste_grupo','Coste Sociales'),
    ('HabilidadSecundariaFija#grupo:perceptivas#coste_grupo','Coste Perceptivas'),
    ('HabilidadSecundariaFija#grupo:intelectuales#coste_grupo','Coste Intelectuales'),
    ('HabilidadSecundariaFija#grupo:vigor#coste_grupo','Coste Vigor'),
    ('HabilidadSecundariaFija#grupo:subterfugio#coste_grupo','Coste Subterfugio'),
    ('HabilidadSecundariaFija#grupo:creativas#coste_grupo','Coste Creativas'),
    ('HabilidadSecundariaFija#nombre:tasacion#coste_habilidad','Coste Tasación'),
    ('Esquiva#categoria','Categoría Esquiva'),
    ('HabilidadSecundariaFija#nombre:advertir#categoria','Categoría Advertir'),
    ('HabilidadSecundariaFija#nombre:buscar#categoria','Categoría Buscar'),
    ('HabilidadSecundariaFija#nombre:ocultarse#categoria','Categoría Ocultarse'),
    ('HabilidadSecundariaFija#nombre:sigilo#categoria','Categoría Sigilo'),
    ('HabilidadSecundariaFija#nombre:tramperia#categoria','Categoría Trampería'),
    ('HabilidadSecundariaFija#nombre:trucos_de_manos#categoria','Categoría Trucos de Manos'),
    ('HabilidadSecundariaFija#nombre:robo#categoria','Categoría Robo'),
    #('UsoKi#habilidades:ocultacion_del_ki#','Categoría Ki Ocultación del Ki'), NO ENTIENDO COMO SE PUNTÚA EL USO DEL KI
    #('',''),   #Para SEGUIR AÑADIENDO
)

# Create your models here.
class Jugador(models.Model):
    jugador = models.ForeignKey(User, primary_key=True)
    #campo que si esta a False, impide que el jugador pueda ser llamado a participar en partidas
    #util cuando el jugador no quiere que lo asalten a mensajes de participacion
    participativo = models.BooleanField(default=True)
    descripcion = models.TextField()
    
    def __unicode__(self):
        return u'%s' % (self.jugador.username)

#esta inclusion debe hacerse aqui, no puede hacerse al principio porque se produce una
#dependencia cruzada con partidas que impide la creacion de ninguna de las dos aplicaciones
from partidas.models import Partida

#######################################################################
#TABLAS CON LAS QUE TIENE RELACION UNA FICHA (FK O M2M DESDE FICHA)
#######################################################################
class Critico(models.Model):
    nombre = models.CharField(max_length=80)
    descripcion = models.TextField()
    
    def __unicode__(self):
        return u'%s' % (self.nombre)

class Arma(models.Model):
    nombre = models.CharField(max_length=80)
    esp = models.IntegerField(null=True, blank=True)
    ataque = models.IntegerField(null=True, blank=True)
    defensa = models.IntegerField(null=True, blank=True)
    dano_base = models.IntegerField(null=True, blank=True)
    bono_fuerza = models.IntegerField(null=True, blank=True)
    dano_final = models.IntegerField(null=True, blank=True)
    especial = models.IntegerField(null=True, blank=True)
    velocidad = models.IntegerField(null=True, blank=True)
    entereza = models.IntegerField(null=True, blank=True)
    rotura = models.IntegerField(null=True, blank=True)
    presencia = models.IntegerField(null=True, blank=True)
    critico = models.ManyToManyField(Critico, null=True, blank=True)

    def __unicode__(self):
        return u'%s' % (self.nombre)

class LocalizacionArmadura(models.Model):
    nombre = models.CharField(max_length=31)

    def __unicode__(self):
        return u'%s' % (self.nombre)

class TipoArmadura(models.Model):
    nombre = models.CharField(max_length=80)
    filo = models.IntegerField()
    contundente = models.IntegerField()
    penetrante = models.IntegerField()
    calor = models.IntegerField()
    electricidad = models.IntegerField()
    frio = models.IntegerField()
    energia = models.IntegerField()
    localizacion = models.ForeignKey(LocalizacionArmadura)
    
    def __unicode__(self):
        return u'%s' % (self.nombre)
    
class Armadura(models.Model):
    nombre = models.CharField(max_length=80)
    entereza = models.IntegerField()
    presencia = models.IntegerField()
    especial = models.IntegerField()
    requerimiento = models.IntegerField()
    tipo = models.ForeignKey(TipoArmadura)

    def __unicode__(self):
        return u'%s' % (self.nombre)

class VentajaFija(models.Model):
    nombre = models.CharField(max_length=80)
    descripcion = models.TextField()
    coste = models.IntegerField()
    
    def __unicode__(self):
        return u'%s' % (self.nombre)

class DesventajaFija(models.Model):
    nombre = models.CharField(max_length=80)
    descripcion = models.TextField()
    coste = models.IntegerField()
    
    def __unicode__(self):
        return u'%s' % (self.nombre)

class VentajaDependiente(models.Model):
    propietario = models.ForeignKey(Jugador)
    nombre = models.CharField(max_length=80)
    descripcion = models.TextField()
    coste = models.IntegerField()

    class Meta:
        unique_together=[['propietario','nombre']]

    def __unicode__(self):
        return u'%s' % (self.nombre)

class DesventajaDependiente(models.Model):
    propietario = models.ForeignKey(Jugador)
    nombre = models.CharField(max_length=80)
    descripcion = models.TextField()
    coste = models.IntegerField()

    class Meta:
        unique_together=[['propietario','nombre']]

    def __unicode__(self):
        return u'%s' % (self.nombre)

class HabilidadSecundariaDependiente(models.Model):
    propietario = models.ForeignKey(Jugador)
    nombre = models.CharField(max_length=80)
    descripcion = models.TextField()
    coste = models.IntegerField()
    base = models.IntegerField()
    bono = models.IntegerField()
    especial = models.IntegerField()
    categoria = models.IntegerField()
    final = models.IntegerField()

    class Meta:
        unique_together=[['propietario','nombre']]

    def __unicode__(self):
        return u'%s' % (self.nombre)

class Bono(models.Model):
    caracteristica = models.CharField(max_length=80, choices=CARACTERISTICAS_BONO)
    cantidad = models.IntegerField()
    accion = models.CharField(max_length=1, choices=ACCION_BONO)

    class Meta:
        unique_together=[['caracteristica','cantidad','accion']]

    def __unicode__(self):
        return u'%s: %s%d' % (self.get_caracteristica_display(), self.accion, self.cantidad)

class Categoria(models.Model):
    nombre = models.CharField(max_length=80)
    descripcion = models.TextField()
    bonos = models.ManyToManyField(Bono, null=True, blank=True)

    def __unicode__(self):
        return u'%s' % (self.nombre)

class Raza(models.Model):
    nombre = models.CharField(max_length=80)
    descripcion = models.TextField()
    bonos = models.ManyToManyField(Bono, null=True, blank=True)

    def __unicode__(self):
        return u'%s' % (self.nombre)

class Tamano(models.Model):
    min = models.IntegerField()
    max = models.IntegerField()
    aspecto = models.CharField(max_length=80)
    ataque_fisico = models.IntegerField()
    armadura_natural = models.IntegerField()
    turno_base = models.IntegerField()
    area = models.IntegerField()
    tipo_mov = models.IntegerField()
    multiplos_acumulacion = models.IntegerField()
    armadura = models.IntegerField()

    def __unicode__(self):
        return u'%s - %s' % (str(self.min),str(self.max))

class DisciplinaPsiquica(models.Model):
    nombre = models.CharField(max_length=80)
    
    def __unicode__(self):
        return u'%s' % (self.nombre)

class EfectoFijo(models.Model):
    nombre = models.CharField(max_length=80)
    descripcion = models.TextField(null=True)
    cm = models.IntegerField()
    
    def __unicode__(self):
        return u'%s' % (self.nombre)    

class EfectoDependiente(models.Model):
    propietario = models.ForeignKey(Jugador)
    nombre = models.CharField(max_length=80)
    descripcion = models.TextField(null=True)
    cm = models.IntegerField()
    
    def __unicode__(self):
        return u'%s - %s' % (self.nombre, self.propietario)    

class TecnicaFija(models.Model):
    nombre = models.CharField(max_length=80)
    descripcion = models.TextField(null=True)
    efectos = models.ManyToManyField(EfectoFijo)
    nivel = models.IntegerField()
    acum_fuerza = models.IntegerField()
    acum_agilidad = models.IntegerField()
    acum_destreza = models.IntegerField()
    acum_constitucion = models.IntegerField()
    acum_poder = models.IntegerField()
    acum_voluntad = models.IntegerField()
    
    def __unicode__(self):
        return u'%s' % (self.nombre)

class TecnicaDependiente(models.Model):
    propietario = models.ForeignKey(Jugador)
    nombre = models.CharField(max_length=80)
    descripcion = models.TextField(null=True)
    efectos = models.ManyToManyField(EfectoDependiente)
    nivel = models.IntegerField()
    acum_fuerza = models.IntegerField()
    acum_agilidad = models.IntegerField()
    acum_destreza = models.IntegerField()
    acum_constitucion = models.IntegerField()
    acum_poder = models.IntegerField()
    acum_voluntad = models.IntegerField()
    
    def __unicode__(self):
        return u'%s - %s' % (self.nombre, self.propietario)

class HabilidadEspecial(models.Model):
    propietario = models.ForeignKey(Jugador)
    nombre = models.CharField(max_length=80)
    descripcion = models.TextField(null=True)
    coste = models.IntegerField()
    
    def __unicode__(self):
        return u'%s - %s' % (self.nombre, self.propietario)

class Tabla(models.Model):
    nombre = models.CharField(max_length=80)
    descripcion = models.TextField()
    coste = models.IntegerField()
    
    def __unicode__(self):
        return u'%s' % (self.nombre)

class Nivel(models.Model):
    nivel = models.IntegerField()
    pdesarrollo = models.IntegerField()
    exp_sig_nvl = models.IntegerField()
    presencia_base = models.IntegerField()
    plus_carac_nvl = models.IntegerField()

    def __unicode__(self):
        return u'%s' % (str(self.nivel))

##########################################################################################
#FICHA GENERAL datos que conforman el formulario inicial de creacion de un personaje
##########################################################################################
class FichaAnima(models.Model):    
    #NOTA: TODOS LOS CAMPOS LOS PONGO INICIALMENTE QUE PUEDEN SER NULOS Y BLANCOS, PERO LUEGO SE VA
    #CAMBIANDO ESTO CONFORME SE DESARROLLE LA LOGICA Y SOBRE TODO LOS FORMULARIOS AL RESPECTO
    partida = models.ForeignKey(Partida, null=True)
    propietario = models.ForeignKey(Jugador)
    personaje = models.CharField(max_length=80)
    pelo = models.CharField(max_length=30, null=True, blank=True)
    ojos = models.CharField(max_length=30, null=True, blank=True)
    edad = models.IntegerField(null=True, blank=True)
    sexo = models.CharField(max_length=1, choices=GENERO_ELECCION)
    altura = models.DecimalField(max_digits=5, decimal_places=2, null=True, blank=True)
    peso = models.DecimalField(max_digits=5, decimal_places=2, null=True, blank=True)
    #ETNIA, NEPHILIM, NIVEL
    nephilim = models.BooleanField(default=False)
    etnia = models.CharField(max_length=30, null=True, blank=True)
    nivel = models.ForeignKey(Nivel, null=True)
    #PUNTOS DE DESARROLLO DISPONIBLES
    puntos_desarrollo_disponibles = models.IntegerField(null=True)
    #ARMAS Y ARMADURAS
    armas = models.ManyToManyField(Arma, null=True, blank=True)
    armaduras = models.ManyToManyField(Armadura, null=True, blank=True)
    #VENTAJAS Y DESVENTAJAS
    ventajas_fijas = models.ManyToManyField(VentajaFija, null=True, blank=True)
    desventajas_fijas = models.ManyToManyField(DesventajaFija, null=True, blank=True)
    ventajas_dependientes = models.ManyToManyField(VentajaDependiente, null=True, blank=True)
    desventajas_dependientes = models.ManyToManyField(DesventajaDependiente, null=True, blank=True)    
    #HABILIDADES SECUNDARIAS DEPENDIENTES
    habilidades_secundarias_dependientes = models.ManyToManyField(HabilidadSecundariaDependiente, null=True, blank=True)
    
    categoria = models.ForeignKey(Categoria, null=True, blank=True)
    raza = models.ForeignKey(Raza, null=True, blank=True)
    tamano = models.ForeignKey(Tamano, null=True, blank=True)
    
    disciplinas_psiquicas = models.ManyToManyField(DisciplinaPsiquica, null=True, blank=True)
    #TECNICAS
    tecnicasfijas = models.ManyToManyField(TecnicaFija, null=True, blank=True)
    tecnicasdependientes = models.ManyToManyField(TecnicaDependiente, null=True, blank=True)
    #HABILIDADES ESPECIALES / TABLAS
    habilidades_especiales = models.ManyToManyField(HabilidadEspecial, null=True, blank=True)
    tablas = models.ManyToManyField(Tabla, null=True, blank=True)

    #El administrador puede banear una ficha
    admin_visible = models.BooleanField(default=False)
    #El usuario puede ocultar su ficha al resto de gente
    visible = models.BooleanField(default=False)

    class Meta:
        unique_together=[['propietario','personaje']]
        
    def __unicode__(self):
        return u'%s - %s' % (self.personaje, self.propietario)


#######################################################################
#TABLAS QUE SE RELACIONAN CON UNA FICHA (FK o M2M HACIA Ficha)
#######################################################################
class TipoCaracteristicaPrincipal(models.Model):
    nombre = models.CharField(max_length=31)
    
    def __unicode__(self):
        return u'%s' % (self.nombre)

class CaracteristicasPrincipales(models.Model):
    ficha = models.ForeignKey(FichaAnima)
    valida = models.BooleanField(default = True)
    nombre = models.ForeignKey(TipoCaracteristicaPrincipal)
    base = models.IntegerField()
    actual = models.IntegerField(null=True, blank=True)
    #bono automatico en funcion de actual
    
    def __unicode__(self):
        return u'%s - %s - %s' % (self.nombre, self.ficha, self.valida)

class Vida(models.Model):
    ficha = models.ForeignKey(FichaAnima)
    valida = models.BooleanField(default = True)
    num_multiplos = models.IntegerField()
    base = models.IntegerField()
    categoria = models.IntegerField()
    multiplos = models.IntegerField()
    final = models.IntegerField()
    
    def __unicode__(self):
        return u'%s - %s' % (self.ficha, self.valida)

class TipoTurno(models.Model):
    nombre = models.CharField(max_length=31)
    
    def __unicode__(self):
        return u'%s' % (self.nombre)

class Turno(models.Model):
    ficha = models.ForeignKey(FichaAnima)
    valida = models.BooleanField(default = True)
    tipo_turno = models.ForeignKey(TipoTurno)
    columna = models.IntegerField(default = 0)  #0: Base  1..n: Especial "n"
    valor = models.IntegerField()
    
    def __unicode__(self):
        return u'%s - %s - %s' % (self.tipo_turno, self.ficha, self.valida)

class NombreHabilidadSecundaria(models.Model):
    nombre = models.CharField(max_length=80)
    slug = models.CharField(max_length=80)
    descripcion = models.TextField()

    def __unicode__(self):
        return u'%s' % (self.nombre)
    
class GrupoHabilidadSecundaria(models.Model):
    nombre = models.CharField(max_length=80)
    slug = models.CharField(max_length=80)
    descripcion = models.TextField()

    def __unicode__(self):
        return u'%s' % (self.nombre)
    
class HabilidadSecundariaFija(models.Model):
    ficha = models.ForeignKey(FichaAnima)
    valida = models.BooleanField(default = True)
    nombre = models.ForeignKey(NombreHabilidadSecundaria)
    grupo = models.ForeignKey(GrupoHabilidadSecundaria)
    tipo = models.ForeignKey(TipoCaracteristicaPrincipal)
    base = models.IntegerField()
    bono = models.IntegerField()
    especial = models.IntegerField()
    categoria = models.IntegerField()
    final = models.IntegerField()
    coste_habilidad = models.IntegerField()
    coste_grupo = models.IntegerField()

    def __unicode__(self):
        return u'%s - %s - %s' % (self.nombre, self.ficha, self.valida)

class Ataque(models.Model):
    ficha = models.ForeignKey(FichaAnima)
    valida = models.BooleanField(default = True)
    coste = models.IntegerField()
    base = models.IntegerField()
    destreza = models.IntegerField()
    categoria = models.IntegerField()
    final = models.IntegerField()
    
    def __unicode__(self):
        return u'%s - %s' % (self.ficha, self.valida)

class Defensa(models.Model):
    ficha = models.ForeignKey(FichaAnima)
    valida = models.BooleanField(default = True)
    coste = models.IntegerField()
    base = models.IntegerField()
    destreza = models.IntegerField()
    categoria = models.IntegerField()
    final = models.IntegerField()
    
    def __unicode__(self):
        return u'%s - %s' % (self.ficha, self.valida)

class Esquiva(models.Model):
    ficha = models.ForeignKey(FichaAnima)
    valida = models.BooleanField(default = True)
    coste = models.IntegerField()
    base = models.IntegerField()
    bono_agilidad = models.IntegerField()
    especial = models.IntegerField()
    categoria = models.IntegerField()
    final = models.IntegerField()
    
    def __unicode__(self):
        return u'%s - %s' % (self.ficha, self.valida)

class Cansancio(models.Model):
    ficha = models.ForeignKey(FichaAnima)
    valida = models.BooleanField(default = True)
    base = models.IntegerField()
    especial = models.IntegerField()
    actual = models.IntegerField()
    
    def __unicode__(self):
        return u'%s - %s' % (self.ficha, self.valida)

class Movimiento(models.Model):
    ficha = models.ForeignKey(FichaAnima)
    valida = models.BooleanField(default = True)
    base = models.IntegerField()
    bonificacion = models.IntegerField()
    penalizacion = models.IntegerField()
    final = models.IntegerField()
    mov_turno = models.IntegerField()
    
    def __unicode__(self):
        return u'%s - %s' % (self.ficha, self.valida)

class LlevarArmadura(models.Model):
    ficha = models.ForeignKey(FichaAnima)
    valida = models.BooleanField(default = True)
    coste = models.IntegerField()
    base = models.IntegerField()
    bono_fuerza = models.IntegerField()
    especial = models.IntegerField()
    final = models.IntegerField()
    
    def __unicode__(self):
        return u'%s - %s' % (self.ficha, self.valida)

class NombreEsfera(models.Model):
    nombre = models.CharField(max_length=20)
    descripcion = models.TextField()

    def __unicode__(self):
        return u'%s' % (self.nombre)

class Esfera(models.Model):
    ficha = models.ForeignKey(FichaAnima)
    valida = models.BooleanField(default = True)
    nombre = models.ForeignKey(NombreEsfera)
    nivel = models.IntegerField()
    
    def __unicode__(self):
        return u'%s - %s - %s' % (self.nombre, self.ficha, self.valida)

class AcumulacionMagica(models.Model):
    ficha = models.ForeignKey(FichaAnima)
    valida = models.BooleanField(default = True)
    coste = models.IntegerField()
    act_base = models.IntegerField()
    multiplos = models.IntegerField()
    especial = models.IntegerField()
    act_real = models.IntegerField()
    
    def __unicode__(self):
        return u'%s - %s' % (self.ficha, self.valida)

class PotencialPsiquico(models.Model):
    ficha = models.ForeignKey(FichaAnima)
    valida = models.BooleanField(default = True)
    base = models.IntegerField()
    especial = models.IntegerField()
    final = models.IntegerField()
    
    def __unicode__(self):
        return u'%s - %s' % (self.ficha, self.valida)

class Zeon(models.Model):
    ficha = models.ForeignKey(FichaAnima)
    valida = models.BooleanField(default = True)
    coste = models.IntegerField()
    base = models.IntegerField()
    categoria = models.IntegerField()
    especial = models.IntegerField()
    final = models.IntegerField()
    
    def __unicode__(self):
        return u'%s - %s' % (self.ficha, self.valida)

class CV(models.Model):
    ficha = models.ForeignKey(FichaAnima)
    valida = models.BooleanField(default = True)
    coste = models.IntegerField()
    base = models.IntegerField()
    libres = models.IntegerField()

    def __unicode__(self):
        return u'%s - %s' % (self.ficha, self.valida)

class ProyeccionMagica(models.Model):
    ficha = models.ForeignKey(FichaAnima)
    valida = models.BooleanField(default = True)
    coste = models.IntegerField()
    base = models.IntegerField()
    bono_destreza = models.IntegerField()
    especial = models.IntegerField()
    final = models.IntegerField()
    desequilibrio_ofensivo = models.IntegerField()
    desequilibrio_defensivo = models.IntegerField()
    desequilibrio_medio = models.IntegerField()
    
    def __unicode__(self):
        return u'%s - %s' % (self.ficha, self.valida)

class ProyeccionPsiquica(models.Model):
    ficha = models.ForeignKey(FichaAnima)
    valida = models.BooleanField(default = True)
    coste = models.IntegerField()
    base = models.IntegerField()
    bono_destreza = models.IntegerField()
    especial = models.IntegerField()
    final = models.IntegerField()
    
    def __unicode__(self):
        return u'%s - %s' % (self.ficha, self.valida)

class AcumulacionesKi(models.Model):
    ficha = models.ForeignKey(FichaAnima)
    valida = models.BooleanField(default = True)
    tipo = models.ForeignKey(TipoCaracteristicaPrincipal)
    acumulacion = models.IntegerField()
    ki = models.IntegerField()
    actual = models.IntegerField()
    
    def __unicode__(self):
        return u'%s - %s - %s' % (self.tipo, self.ficha, self.valida)

class HabilidadKi(models.Model):
    nombre = models.CharField(max_length=80)
    slug = models.CharField(max_length=80)
    coste = models.IntegerField()
    dependencia = models.ForeignKey('self', null=True, blank=True)
    
    def __unicode__(self):
        return u'%s' % (self.nombre)

class UsoKi(models.Model):
    ficha = models.ForeignKey(FichaAnima)
    valida = models.BooleanField(default = True)
    habilidades = models.ManyToManyField(HabilidadKi)
    cmarcial = models.IntegerField()

    def __unicode__(self):
        return u'%s - %s' % (self.ficha, self.valida)

class HabilidadPsiquica(models.Model):
    nombre = models.CharField(max_length=80)
    bon = models.IntegerField()
    dif = models.IntegerField()
    
    def __unicode__(self):
        return u'%s' % (self.nombre)

class HabsPsiquicas(models.Model):
    ficha = models.ForeignKey(FichaAnima)
    valida = models.BooleanField(default = True)
    habilidades = models.ManyToManyField(HabilidadPsiquica)
    numero_innatos = models.IntegerField()
    
    def __unicode__(self):
        return u'%s - %s' % (self.ficha, self.valida)

class NombreConvocacion(models.Model):
    nombre = models.CharField(max_length=20)
    descripcion = models.TextField()
    caracteristica = models.ForeignKey(TipoCaracteristicaPrincipal)

    def __unicode__(self):
        return u'%s' % (self.nombre)

class Convocacion(models.Model):
    ficha = models.ForeignKey(FichaAnima)
    valida = models.BooleanField(default = True)
    nombre_convocacion = models.ForeignKey(NombreConvocacion)
    base = models.IntegerField()
    bono = models.IntegerField()
    especial = models.IntegerField()
    final = models.IntegerField()
    
    def __unicode__(self):
        return u'%s - %s - %s' % (self.nombre_convocacion, self.ficha, self.valida)

class ConvocacionEspecializacion(models.Model):
    ficha = models.ForeignKey(FichaAnima)
    valida = models.BooleanField(default = True)
    especializacion = models.TextField()

    def __unicode__(self):
        return u'%s - %s - %s' % (self.especializacion, self.ficha, self.valida)

class InfoArteMarcial(models.Model):
    nombre = models.CharField(max_length=20)
    descripcion = models.TextField()
    bonos = models.ManyToManyField(Bono)
    
    def __unicode__(self):
        return u'%s' % (self.nombre)

class ArtesMarciales(models.Model):
    ficha = models.ForeignKey(FichaAnima)
    valida = models.BooleanField(default = True)
    artes_marciales = models.ManyToManyField(InfoArteMarcial)
    conocimiento_marcial_total = models.IntegerField()
    bono_ataque = models.IntegerField()
    bono_defensa = models.IntegerField()
    dano = models.IntegerField()

    def __unicode__(self):
        return u'%d - %s - %s' % (self.conocimiento_marcial_total, self.ficha, self.valida)

class InfoResistencia(models.Model):
    nombre = models.CharField(max_length=20)
    descripcion = models.TextField(null=True, blank=True)
    caracteristica = models.ForeignKey(TipoCaracteristicaPrincipal)
    
    def __unicode__(self):
        return u'%s' % (self.nombre)

class Resistencias(models.Model):
    ficha = models.ForeignKey(FichaAnima)
    valida = models.BooleanField(default = True)
    resistencia = models.ForeignKey(InfoResistencia)
    base = models.IntegerField()
    bono = models.IntegerField()
    especial = models.IntegerField()
    final = models.IntegerField()

    def __unicode__(self):
        return u'%s - %s' % (self.ficha, self.valida)

class TipoEquipo(models.Model):
    nombre = models.CharField(max_length=20)
    descripcion = models.TextField(null=True, blank=True)
    
    def __unicode__(self):
        return u'%s' % (self.nombre)

class Equipo(models.Model):
    ficha = models.ForeignKey(FichaAnima)
    valida = models.BooleanField(default = True)
    tipo = models.ForeignKey(TipoEquipo)
    detalle = models.TextField(null=True, blank=True)

    def __unicode__(self):
        return u'%s - %s' % (self.ficha, self.valida)

class Contacto(models.Model):
    ficha = models.ForeignKey(FichaAnima)
    valida = models.BooleanField(default = True)
    nombre = models.CharField(max_length=80)
    descripcion = models.TextField(null=True, blank=True)

    def __unicode__(self):
        return u'%s - %s - %s' % (self.nombre, self.ficha, self.valida)

class Notas(models.Model):
    ficha = models.ForeignKey(FichaAnima)
    valida = models.BooleanField(default = True)
    descripcion = models.TextField()

    def __unicode__(self):
        return u'%s - %s - %s' % (self.descripcion, self.ficha, self.valida)

class Dinero(models.Model):
    ficha = models.ForeignKey(FichaAnima)
    valida = models.BooleanField(default = True)
    nombre = models.CharField(max_length=80)
    coste = models.IntegerField()
    cantidad = models.IntegerField()

    def __unicode__(self):
        return u'%s - %s - %s' % (self.nombre, self.ficha, self.valida)

class Raciones(models.Model):
    ficha = models.ForeignKey(FichaAnima)
    valida = models.BooleanField(default = True)
    nombre = models.CharField(max_length=80)
    cantidad = models.IntegerField()

    def __unicode__(self):
        return u'%s - %s - %s' % (self.nombre, self.ficha, self.valida)

class Proyectiles(models.Model):
    ficha = models.ForeignKey(FichaAnima)
    valida = models.BooleanField(default = True)
    nombre = models.CharField(max_length=80)
    cantidad = models.IntegerField()

    def __unicode__(self):
        return u'%s - %s - %s' % (self.nombre, self.ficha, self.valida)


#################
# NUEVAS TABLAS     para detalles posteriormente añadidos
#################
class ImagenesCategorias(models.Model):
    categoria = models.ForeignKey(Categoria)
    imagen = models.ImageField(_(u'Imagen de Categoria'), upload_to = "img/categorias")

    def __unicode__(self):
        return u'%s' % (self.categoria)
